package com.lmh.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.CharsetUtil;
import io.netty.util.ReferenceCountUtil;

public class DiscardServerHandler extends ChannelHandlerAdapter {

	/**
	 * 覆盖原channleRead事件处理方法
	 * 当客户端收到新的数据时，这个方法会在收到消息时被调用
	 * 消息类型为ByteBuf
	 * @param ctx	通道处理的上下文消息
	 * @param msg	接收的消息
	 */
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg){
		try {
			ByteBuf in = (ByteBuf) msg;
			//接收客户端发送的数据进行打印
			System.out.println(in.toString(CharsetUtil.UTF_8));
		} catch (Exception e) {
			/**
             * ByteBuf是一个引用计数对象，这个对象必须显示地调用release()方法来释放。
             * 请记住处理器的职责是释放所有传递到处理器的引用计数对象。
             */
            // 抛弃收到的数据
			ReferenceCountUtil.release(msg);
		}
		
	}
	
	/**
	 * 发生异常时触发该方法
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){
		/**
		 * 出现Throwable对象被调用，即当Netty由于IO错误
		 */
		cause.printStackTrace();
		ctx.close();
	}
}
